package com.ljx.reflect.reflect03;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * @author LJX
 * @Description: TODO
 * @Date: 2022/10/27 10:51
 * @Version 1.0
 */
public class Test02 {
	public static void main(String[] args) throws Exception{
		// 获取class对象
		Class<Ltf> ltfClass = Ltf.class;
		// 通过反射类获取指定方法的对象
		// 根据方法名和参数类类型获取本类中指定的对象
		Method doSome = ltfClass.getDeclaredMethod("fun1");

		Method fun2 = ltfClass.getDeclaredMethod("fun2", String.class);

		// 获取本类中所有的方法
		Method[] declaredMethods = ltfClass.getDeclaredMethods();
		for (Method declaredMethod : declaredMethods) {

		}

		// 根据方法名和参数类型获取本类中以及父类中指定的公共（public）的方法对象
		Method fun1 = ltfClass.getMethod("fun1");
		Method doSome1 = ltfClass.getMethod("doSome",String.class);
		// 不能获取到本类或者父类中私有的方法，
//		Method fun21 = ltfClass.getMethod("fun2");

		// 获取本类以尽父类的所有公共的方法(还包含了Object祖宗类中的方法)
		Method[] methods = ltfClass.getMethods();
		for (Method method : methods) {
		}


		// Object invoke(Object obj, Object... args)
		// 在具有指定参数的 方法对象上调用此 方法对象表示的底层方法。
		//普通: 对象名.方法(实参)  反射: 方法对象。invoke(对象名,实参)
		Method fun = ltfClass.getDeclaredMethod("fun1");
		// 通过反射类获取到类对象
		Ltf ltf = ltfClass.newInstance();
		Object a = fun.invoke(ltf);
//		System.out.println(a);

		Method fun21 = ltfClass.getDeclaredMethod("fun2", String.class);
		Object hahha = fun21.invoke(ltf, "hahha");
		System.out.println(hahha);
	}
}

class Ltf extends Hjy{
	public void fun1(){
		System.out.println("fun1方法");
	}

	public String fun2(String name){
		System.out.println("fun2方法");
		return name;
	}
}
class Hjy{
	public void doSome(String name){
		System.out.println("doSome方法");
	}

	private void doOther(){
		System.out.println("doOther方法");
	}
}